/**
 * FileName: NettyCallbackUtil
 * Author: Mr.Wang
 * Date: 2025/10/16 10:32
 * Description:
 * History:
 */
package org.test.device.utils.netty;

import lombok.extern.slf4j.Slf4j;

/**
 * 〈一句话功能简述〉<br>
 * 〈〉
 *
 * @author Mr.Wang
 * @create 2025/10/16
 * @since 1.0.0
 */
@Slf4j
public class NettyCallbackUtil {

    /**
     * 通用成功回调处理：所有业务共用的日志、数据库更新等
     */
    public static void commonOnSuccess(String businessTag, String originalMsg, String serverResponse) {
        try {
            // 1. 通用成功日志（所有业务统一格式）
            log.info("[{}] 消息发送成功，原始消息：{}，服务端响应：{}",
                    businessTag, originalMsg, serverResponse);

            // 2. 通用业务处理（所有业务共用，如更新消息状态到数据库）
            // 示例：DbUtil.updateMessageStatus(originalMsg, "SUCCESS", serverResponse);

            // 3. 业务定制化扩展（可选，按标签区分）
            switch (businessTag) {
                case "DEVICE_DATA_REPORT":
                    // 设备上报的通用扩展（如统计上报次数）
                    log.debug("[DEVICE_DATA_REPORT] 累计上报成功次数+1");
                    break;
                case "DEVICE_COMMAND":
                    // 指令下发的通用扩展（如记录指令执行时间）
                    log.debug("[DEVICE_COMMAND] 指令响应时间：{}ms", System.currentTimeMillis());
                    break;
                default:
                    // 无特殊扩展的业务，直接跳过
                    break;
            }
        } catch (Exception e) {
            log.error("[{}] 成功回调通用处理异常", businessTag, e);
        }
    }

    /**
     * 通用失败回调处理：所有业务共用的日志、重试、告警等
     */
    public static void commonOnFailure(String businessTag, String originalMsg, Throwable error, int retryCount) {
        try {
            // 1. 通用失败日志（所有业务统一格式）
            log.error("[{}] 消息发送失败（重试次数：{}），原始消息：{}",
                    businessTag, retryCount, originalMsg, error);

            // 2. 通用业务处理（所有业务共用，如更新消息状态到数据库）
            // 示例：DbUtil.updateMessageStatus(originalMsg, "FAIL", error.getMessage());

            // 3. 通用重试控制（所有业务共用，基于NettyClientManager的最大重试次数）
            if (retryCount < NettyClientManager.MAX_RECONNECT_COUNT) {
                log.info("[{}] 准备进行第{}次重试", businessTag, retryCount + 1);
            } else {
                // 4. 通用告警（超过最大重试次数，所有业务共用）
                log.error("[{}] 已达最大重试次数（{}次），触发告警",
                        businessTag, NettyClientManager.MAX_RECONNECT_COUNT);
                // 示例：AlarmUtil.send("Netty消息失败", businessTag + "：" + originalMsg);
            }
        } catch (Exception e) {
            log.error("[{}] 失败回调通用处理异常", businessTag, e);
        }
    }
}